package edu.tfh.s2.ehkbot.daten;

import java.util.HashMap;
import java.util.Vector;

import edu.tfh.s2.ehkbot.gerete.aktoren.MotorAktor;
import edu.tfh.s2.ehkbot.gerete.sensoren.Sensor;
import edu.tfh.s2.ehkbot.steuerung.BusAdresse;

/**
 * GeraeteRegistration dient dazu Informationen zu sammeln welche Aktoren und Sensoren sich im System
 * befinden.
 * 
 * @author s2zehn
 */
public class GeraeteRegistration {
	private static GeraeteRegistration instance = null;

	/**
	 * Singelton Methode.
	 * 
	 * @return Die einzige Instanz von GeraeteRegistration
	 */
	public static GeraeteRegistration getInstance() {
		if (instance == null) {
			instance = new GeraeteRegistration();
		}
		return instance;
	}

	private Vector<MotorAktor> motorAktorliste = new Vector<MotorAktor>();

	private Vector<Sensor> sensorListe = new Vector<Sensor>();

	/**
	 * privater Konstruktor, siehe Singelton Pattern.
	 */
	private GeraeteRegistration() {
	}

	/**
	 * Sucht in der Registrierung nach Sensoren dich sich in Modul befinden und einen von den Namen tragen der
	 * in den String Array übergebenen namen.
	 * 
	 * @param modulName
	 *            In diesen Modul wird gesucht.
	 * @param names
	 *            String array mit den Namen der zu Suchenden Sensoren.
	 * @return Die Gefundenen Sensoren als HashMap, key ist der name des Sensores, Value ist der Sensor.
	 */
	public HashMap<String, Sensor> findeSensoren(String modul, String[] names) {
		AdressenDispatcher adrD = AdressenDispatcher.getInstance();
		HashMap<String, Sensor> gefunden = new HashMap<String, Sensor>();
		for (Sensor sensor : sensorListe) {
			String sensorModul = adrD.getModulForAdresse(sensor.getBusAdresse());
			String sensorName = adrD.getNameForAdresse(sensor.getBusAdresse());
			if (sensorModul.equals(modul)) {
				for (String iter : names) {
					if (iter.equals(sensorName)) {
						gefunden.put(iter, sensor);
						break;
					}
				}
			}
		}
		return gefunden;
	}

	/**
	 * Sucht nach einen MotorAktor der zu busAdresse passt.
	 * 
	 * @param busAdresse
	 *            Nach diese BusAdresse wird gesucht in der Registrierung.
	 * @return null fals nicht gefunden.
	 */
	public MotorAktor getMotorAktorFromAdresse(BusAdresse busAdresse) {
		for (MotorAktor item : motorAktorliste) {
			if (item.getBusAdresse().equals(busAdresse))
				return item;
		}
		return null;
	}

	/**
	 * Liefert die registrierten MotorAktoren des System.
	 * 
	 * @return Die registrierten MotroAktoren.
	 */
	public Vector<MotorAktor> getMotorAktorListe() {
		return motorAktorliste;
	}

	public Sensor getSensorFromAdresse(BusAdresse busAdresse) {
		for (Sensor item : sensorListe) {
			if (item.getBusAdresse().equals(busAdresse))
				return item;
		}
		return null;
	}

	/**
	 * Liefert die registrierten Sensoren des System.
	 * 
	 * @return Die registrierten Sensoren.
	 */
	public Vector<Sensor> getSensorListe() {
		return sensorListe;
	}

	/**
	 * Registriert ein MotorAktor.
	 * 
	 * @param motorAktor
	 *            Der MotorAktor der registriert wird.
	 */
	public void register(MotorAktor motorAktor) {
		motorAktorliste.add(motorAktor);
	}

	/**
	 * Registriert ein Sensor.
	 * 
	 * @param sensor
	 *            Der Sensor der registriert wird.
	 */
	public void register(Sensor sensor) {
		sensorListe.add(sensor);
	}

	/**
	 * Entfernt ein MotorAktor aus der Liste.
	 * 
	 * @param motorAktor
	 *            Der zu Entfernende MotorAktror.
	 */
	public void unregister(MotorAktor motorAktor) {
		for (int i = 0; i < motorAktorliste.size(); ++i) {
			if (motorAktorliste.get(i).equals(motorAktor)) {
				motorAktorliste.remove(i);
				break;
			}
		}
	}

	/**
	 * Entfernt ein Sensor aus der Liste.
	 * 
	 * @param sensor
	 *            Der zu Entfernende Sensor.
	 */
	public void unregister(Sensor sensor) {
		for (int i = 0; i < sensorListe.size(); ++i) {
			if (sensorListe.get(i).equals(sensor)) {
				sensorListe.remove(i);
				break;
			}
		}
	}

}
